void main()
{
_GeneratePrimes(20); //a-3 

_Exit();
}

void _GeneratePrimes()
{
assign x10  Max    // passed number
assign x11  arrayStart
assign x12  memoryPtr
assign x13  number
assign x14  true
assign x15 numberFound

// calls:
// CheckIfPrimes() shares needed registers
// returns t0 = 1 if prime, t1 = 0 otherwise

//s- Set number of primes to calculate
addi Max,t1,0

//s- Set Prime Memory start
x11 = 0x100
addi x12,x11,0
cout << "Calculating Primes"  << endl;

//s- first prime = 2
addi number,zero,2
sw number,0(memoryPtr)  
addi memoryPtr,memoryPtr,4  // increment ptr

cout << x13  << endl;  

//s- numberFound = 1
addi numberFound,zero,1

//s- number = 1
addi number,zero,1

Test:


//s- number = number + 2 
addi number,number,2


//Y-Test Number is Prime ?
_CheckIfPrime();   


addi true,zero,1  // true = 1
bne true,t1,Test

//s- add as prime
sw number,0(memoryPtr)  
addi memoryPtr,memoryPtr,4  // increment ptr

cout  << x13 <<  endl;  
//s- numberFound++
addi numberFound,numberFound,1

//Y-Test Max reached ?
blt numberFound, Max, Test

cout << "Complete" << endl; 
//x-
}



int _AdividesB()  //a-5
{
// input
assign t1 divisor     //a-
assign t2 principal   //a-

//uses
assign t3 times       //a-
assign t4 diff        //a-
assign t5 remainder   //a-

//returns
x1 = times
x2 remainder

//s- zero times and remainder
addi times,zero,0
addi remainder,zero,0

//s- Print out divisor and principle
//cout << "divisor = " <<  x6  <<  endl;
//cout << "principal = "  <<  x7 <<  endl << endl;

//s- if divisor > principal Done
//N-Done divisor > principal ?
blt t2,t1,Done

//s- remainder = principal
addi remainder,principal,0

Next:

//s- Increment times
addi times,times,1 

//s- remainder = remainder - divisor
sub remainder,remainder,divisor

bge remainder,divisor,Next
//N-Next remainder > divisor

Done:
//cout << "Result:"  << endl;
//s- Print out times and remainder
//cout << "Times = "  << x28 << endl;
//cout << "Remainder = "  << x30 <<  endl;

addi t2,remainder,0
addi t1,times,0

//x-
}

// number is prime if no lower prime divides it evenly
int _CheckIfPrime()  //a-3
{
// ro implies read only
// inherit from GeneratePrimes()
assign x11 ro.firstPrimePtr
assign x12 ro.lastPrimePtr
assign x13 ro.number

//return to GeneratePrimes(), 1 = true = prime, 0 = not prime
assign t1 results


// AdividesB subroutine interface
//input
assign t1 in.divisor     
assign t2 in.principal 

//results
assign t1 op.times
assign t2 op.remainder

//working registers used
assign x16 PrimePtr

//s- Test number against all primes before
//s- number in x13

//s- load prime array ptr
addi PrimePtr,ro.firstPrimePtr,0

test:
//s- load prime
lw in.divisor,0(PrimePtr) 
//cout << "PrimePtr = "    <<  x16  << endl; 
//cout << "Dividing by " <<  x6  << endl;

addi in.principal,ro.number,0      //  t2 = ro.number to check if prime

//N-NotPrime Prime a factor of number?
_AdividesB() ;    // returns 1 if divides evenly

beq t2,zero, NotPrime

//N-test More primes ?
addi PrimePtr,PrimePtr,4               // next to try

// test while PrimePtr != ro.lastPrimePtr
bne PrimePtr,ro.lastPrimePtr, test

Prime:
//s- Set results to 1 
addi results,zero,1   // return prime number
//s- goto end
beq zero,zero, end

NotPrime:
//s- set results to 0
addi results,zero,0   // false
end:
//s- return results
//x-
}


